package com.aura.common.redis.service;

import com.aura.common.core.utils.JsonUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Set;

/**
 * @ClassName RedisSetService
 * @Description
 * @Author ZJX
 * @Date 2025/7/19 23:53
 * @Version 1.0
 **/
@Component
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public class RedisSetService {
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * set添加元素（批量添加或添加单个元素）
     * @param key key
     * @param member 元素信息
     */
    public void addMember(final String key, Object... member) {
        redisTemplate.opsForSet().add(key, member);
    }

    /**
     * 删除元素
     * @param key key
     * @param member 元素信息
     */
    public void deleteMember(final String key, Object... member) {
        redisTemplate.opsForSet().remove(key, member);
    }


    /**
     * 获取set数据（支持复杂的泛型嵌套）
     * @param key key
     * @param typeReference 类型模板
     * @return set数据
     * @param <T> 类型信息
     */
    public <T> Set<T> getCacheSet(final String key, TypeReference<Set<T>> typeReference) {
        Set data = redisTemplate.opsForSet().members(key);
        return JsonUtil.string2Obj(JsonUtil.obj2String(data), typeReference);
    }

    /**
     * 获取 Set 集合的元素个数
     * @param key Redis key
     * @return 元素个数
     */
    public long getSetSize(final String key) {
        Long size = redisTemplate.opsForSet().size(key);
        return size == null ? 0 : size;
    }

    /**
     * 判断 Set 是否包含指定元素
     * @param key Redis key
     * @param value 元素值
     * @return 是否存在
     */
    public boolean isMember(final String key, Object value) {
        Boolean result = redisTemplate.opsForSet().isMember(key, value);
        return result != null && result;
    }

    /**
     * 清空整个 Set 集合
     * @param key Redis key
     */
    public void clearSet(final String key) {
        redisTemplate.delete(key);
    }

}
